package com.example.Windturbine.Utils;

import org.junit.jupiter.api.Test;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.context.annotation.Bean;
import org.springframework.stereotype.Component;

import java.util.concurrent.*;
import java.util.concurrent.atomic.AtomicInteger;

/**
 * @Author 丁永新
 * @Date 2021/12/23
 */

@Component
public class MyThreadPool {


    @Bean
    public ThreadPoolExecutor getMyThreadPoll() {
        /**手写线程池
         * @param corePoolSize     核心池大小 int
         * @param maximumPoolSize  最大池大小 int
         * @param keepAliveTime    保活时间   long（任务完成后要销毁的延时）
         * @param unit             时间单位    决定参数3的单位，枚举类型的时间单位
         * @param workQueue        工作队列    用于存储任务的工作队列（BlockingQueue接口类型）
         * @param threadFactory    线程工厂    用于创建线程
         *
         *线程不是越多越好，google工程师推荐  线程个数=cpu核心数+1（例如四核的开5个线程最好）
         * */
        // 参数任务上限
        LinkedBlockingQueue<Runnable> blockingQueue = new LinkedBlockingQueue<>(100);
        ThreadFactory threadFactory = new ThreadFactory() {
            //  int i = 0;  用并发安全的包装类
            AtomicInteger atomicInteger = new AtomicInteger(1);

            @Override
            public Thread newThread(Runnable r) {
                //创建线程 吧任务传进来
                Thread thread = new Thread(r);
                // 给线程起个名字
                thread.setName("MyThread" + atomicInteger.getAndIncrement());
                return thread;
            }
        };
        ThreadPoolExecutor pool = new ThreadPoolExecutor(10, 10, 5, TimeUnit.MINUTES, blockingQueue, threadFactory);
        return pool;

    }


}
